﻿#pragma once

#include <xy/geom/camera.h>

namespace xy
{

namespace ais
{

struct msg_mouse
{
    enum Button
    {
        Left,
        Middle,
        Right
    };

    enum Status
    {
        Move,
        Press,
        Release
    };

    float depth{1.0f};        // 记录深度
    Button button{Left};      // 左中右
    Status status{Move};      // 悬停/点击/释放
    geom::vec2f pressPos{};   // 点击位置
    geom::vec2f movePos{};    // 移动位置
};

class context
{
    enum Action3d
    {
        None,
        Rotate,
        Scale,
        Translate
    };

  public:
    context(context &&) = delete;

    /**
     * @brief 相机数据初始化
     *
     * @param[in] camera
     */
    context(std::shared_ptr<geom::camera> camera);

    /**
     * @brief 鼠标滚轮消息
     *
     * @param[in] angleDelta
     */
    void mouse_wheel_event(float angleDelta);

    /**
     * @brief 鼠标按压消息
     *
     * @param pos
     * @param button
     */
    void mouse_press_event(const geom::vec2f &pos, msg_mouse::Button button);

    /**
     * @brief 鼠标释放消息
     *
     * @param pos
     */
    void mouse_release_event(const geom::vec2f &pos);

    /**
     * @brief 鼠标移动消息
     *
     * @param pos
     */
    void mouse_move_event(const geom::vec2f &pos);

    /**
     * @brief 键盘消息
     *
     * @param[in] key
     */
    void key_event(int key);

  private:
    float m_angleRate{0.25f};
    float m_scaleRate{2.0f};
    Action3d m_action{None};
    std::shared_ptr<geom::camera> m_camera;
    std::shared_ptr<msg_mouse> m_mouseMsg;
};

} // namespace ais

} // namespace xy
